generic
   type cercle (<>) is private;
   type individu (<>) is private;
   type message (<>) is private;
   type mur (<>) is private;
   with function est_defini(M:mur;N:natural) return boolean is <>;
   with function auteur(M:mur;N:natural) return individu is <>;
   with function creer(I : individu) return mur is <>;
   with function ajouter(un_mur:mur;M : Message;Auteur : individu;N : Natural) return mur is <>;



package communautes is
   type communaute is abstract tagged private;

   function creer return communaute is abstract;
   function inscrire(C0:communaute; I1:individu) return communaute is abstract;
   function bloquer (C0:communaute; I1,I2: individu) return communaute is abstract;
   function debloquer(C0:communaute;I1,I2: individu) return communaute is abstract;
   function ajouter_cercle(C0:communaute; I1: individu; C1:cercle) return communaute is abstract;
   function retirer_cercle(C0:communaute; I1: individu; C1:cercle) return communaute is abstract;
   function ajouter_membre(C0:communaute; I1: individu; C1:cercle; I2: individu) return communaute is abstract;
   function retirer_membre(C0:communaute; I1: individu; C1:cercle; I2: individu) return communaute is abstract;
   function poster(C0:communaute;I1:individu;C1:cercle;t: message) return communaute is abstract;
   function commenter(C0: communaute; I1:individu; I:Natural; T: message) return communaute is abstract;

   function est_inscrit(C0:communaute;I1:individu) return boolean is abstract;
   function nombre_inscrit(C0:communaute) return natural is abstract;
   function ieme_inscrit(C0:communaute;I:Natural) return individu is abstract;
   function est_bloque(C0:communaute; I1,I2:individu) return boolean is abstract;
   function est_cercle_de(C0:communaute;I1:individu;C1:cercle) return boolean is abstract;
   function est_membre_de(C0:communaute;I1:individu;C1:cercle;I2:individu) return boolean is abstract;
   function ieme_membre(C0:communaute;I1:individu;C1:cercle;I:natural) return individu is abstract;
   function consulter(C0:communaute;I1:individu) return Mur is abstract;
   function nombre_post(C0:communaute) return Natural is abstract;
   function nombre_membre_de(C0: communaute;I1 : individu ; C1 : cercle  ) return Natural is abstract;
   function nombre_cercle_de(C0: communaute; I1 : individu) return Natural is abstract;
   function ieme_cercle(C0: communaute ; I1 : individu ; N : Natural) return cercle is abstract;

private
   type communaute is abstract tagged null record;
end communautes;

